package com.bnz.search.util;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.BulkRequest;
import co.elastic.clients.util.ObjectBuilder;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bnz.search.dao.ItemDao;
import com.bnz.search.entity.ItemEntity;
import javafx.util.Builder;
import org.elasticsearch.Build;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

@SpringBootTest
public class ESUtil {
    // 引入ElasticsearchClient对象
    @Autowired
    private ElasticsearchClient client;
    @Autowired
    private ItemDao itemDao;
    // 1. 建立索引库
    @Test
    public void test01() throws IOException {
        //1.1 创建索引,名字为item
        client.indices().create(
                idx->idx.index("item")
                .mappings(m->m
                        .properties("title",p1->p1.text(t1->t1.analyzer("ik_smart").searchAnalyzer("ik_smart")))
                        .properties("price",p2->p2.float_(f->f))
                        .properties("brand",p3->p3.keyword(k->k))
                        .properties("category",p4->p4.keyword(k->k))
                )
        );
    }
    // 2. 将数据库的数据添加到索引库中
    @Test
    public void test02() throws IOException {
        // 2.1 先将数据库的内容查询出来（只将status状态值为1的，也就是审核通过的商品查询出来）
        List<ItemEntity> itemEntities = itemDao.selectList(new QueryWrapper<ItemEntity>().eq("status", "1"));
        // 2.2 处理specMap的数据，它本身不是item里面的字段，存放的是spec对象
        for (ItemEntity itemEntity : itemEntities) {
            // 2.2.1 得到spec
            String spec = itemEntity.getSpec();
            // 2.2.2 将spec数据放到specMap中
            Map map = JSON.parseObject(spec, Map.class);
            itemEntity.setSpecMap(map);
        }
        // 2.3 将数据库的数据添加到索引库中
        BulkRequest.Builder builder = new BulkRequest.Builder();
        // 2.3.1 将数据遍历添加进索引库
        for (ItemEntity itemEntity : itemEntities) {
            builder.operations(ope->ope.index(idx->idx
                    .index("item")
                    .id(itemEntity.getId() + "")
                    .document(itemEntity)
            ));
        }
        BulkRequest request = builder.build();
        client.bulk(request);
    }
}
